package ar.edu.utn.frsf.tpae.a2012.g01.presentacion.controller;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import ar.edu.utn.frsf.tpae.a2012.g01.model.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g01.model.CuentaCorriente;
import ar.edu.utn.frsf.tpae.a2012.g01.model.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g01.model.MovimientoPago;
import ar.edu.utn.frsf.tpae.a2012.g01.presentacion.util.ServiceLocator;
import ar.edu.utn.frsf.tpae.a2012.g01.service.CuentaService;
import ar.edu.utn.frsf.tpae.a2012.g01.service.MovimientoService;

public class CuentaBean implements Serializable {

	private static final long serialVersionUID = -3374792530755053625L;

	private List<Cuenta> listaCuentas;

	private Integer indiceComboCuenta;

	private String descripcion;

	private float monto;

	@PostConstruct
	public void init() {
		indiceComboCuenta = null;
		descripcion = null;
		monto = 0;
		FacesContext context = FacesContext.getCurrentInstance();
		ClienteBean clienteBean = (ClienteBean) context.getApplication()
				.evaluateExpressionGet(context, "#{clienteBean}",
						ClienteBean.class);
		CuentaService cuentaService = ServiceLocator.getCuentaService();

		listaCuentas = cuentaService.getCuentasPorCliente(clienteBean
				.getCliente());

	}

	public List<Cuenta> getListaCuentas() {
		return listaCuentas;
	}

	public void setListaCuentas(List<Cuenta> listaCuentas) {
		this.listaCuentas = listaCuentas;
	}

	public Integer getIndiceComboCuenta() {
		return indiceComboCuenta;
	}

	public void setIndiceComboCuenta(Integer indiceComboCuenta) {
		this.indiceComboCuenta = indiceComboCuenta;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public float getMonto() {
		return monto;
	}

	public void setMonto(float monto) {
		this.monto = monto;
	}

	/**
	 * retorna el tipo de cuenta.
	 * 
	 * @param cuenta
	 * @return
	 */
	public String tipoCuenta(Cuenta cuenta) {
		if (cuenta instanceof CuentaCorriente) {
			return "Cuenta Corriente";
		} else {
			return "Caja de Ahorro";
		}
	}

	/**
	 * carga los valores del comboBox (cuentas del usuario).
	 * 
	 * @return
	 */
	public List<SelectItem> cargarCombo() {

		List<SelectItem> valores = new ArrayList<SelectItem>();
		int i = 0;
		for (Cuenta cuenta : this.listaCuentas) {
			if (cuenta instanceof CuentaCorriente) {
				SelectItem a = new SelectItem(i, "CC-" + cuenta.getId());
				valores.add(a);
				i++;
			} else {
				SelectItem a = new SelectItem(i, "CA-" + cuenta.getId());
				valores.add(a);
				i++;
			}
		}
		return valores;
	}

	/**
	 * agrega un nuevo movimiento a la cuenta.
	 * 
	 * @return
	 */
	public String agregarMovimiento() {

		long nroCuenta = this.listaCuentas.get(indiceComboCuenta).getNumero();

		for (Cuenta cuenta : this.listaCuentas) {
			if (cuenta.getNumero() == nroCuenta) {
				Calendar calendar = Calendar.getInstance();
				String codigo = "" + calendar.get(Calendar.YEAR)
						+ calendar.get(Calendar.MONTH)
						+ calendar.get(Calendar.DATE)
						+ calendar.get(Calendar.HOUR)
						+ calendar.get(Calendar.MINUTE);

				MovimientoPago nuevoMovimientoPago = new MovimientoPago();
				nuevoMovimientoPago.setCuenta(cuenta);
				nuevoMovimientoPago.setCodigo(codigo);
				nuevoMovimientoPago.setFecha(calendar.getTime());
				nuevoMovimientoPago.setUsuarioCmt(this.descripcion);
				nuevoMovimientoPago.setMonto(this.monto);

				List<Movimiento> listMov = new ArrayList<Movimiento>();
				listMov.add(nuevoMovimientoPago);

				MovimientoService movimientoService = ServiceLocator
						.getMovimientoService();

				try {
					movimientoService.crear(listMov);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			}
		}
		return "navigateToVolver";
	}

	/**
	 * setea el color del label que muestra el monto.
	 * 
	 * @param mov
	 * @return
	 */
	public String changeColour(Cuenta cuenta) {
		if (cuenta.getSaldoActual() < 0)
			return "red";
		return "green";
	}
	
	/**
	 * retorna true si el cliente tiene cuenta
	 * @return
	 */
	public String hayCuentas(){
		System.out.println(listaCuentas.size());
	
		//return (listaCuentas==null)?"false":"true";
		if(listaCuentas.isEmpty()){
			return "true";
		}
		else{
			return "false";				
		}
	}
	
}
